Prerequisites

Platform

The source data contains traditional Chinese characters encoded in UTF-8. To avoid troublesome encoding issues (especially in a Windows platform with a default CP1252 code page), the codes in this notebook are only tested on Ubuntu and macOS. Codes are in general still working under Windows. Just that some code chunks may not be able to print out unicode characters nicely.

Data

Election Data

We use minimally pre-processed data for our analytics. Please refer to the repo TW_Presidential_Election_2020 for details about the pre-processing logic. To directly download the archives please visit here. We put the uncompressed files under data/processed at our project root directory.

Map Data

For Taiwan map information, the shp file (shapefile) can be downloaded at GADM.org. We put the unzipped files under data/map at our project root directory.

Dependencies

Additional dependencies are required for Linux machine in order to do map plotting. Here is the instruction for Ubuntu.

Install gdal:

sudo add-apt-repository ppa:ubuntugis/ubuntugis-unstable
sudo apt update
sudo apt install libgdal-dev

Install ubunits:

sudo apt install libudunits2-dev

After installation of the above packages, we can then install and import the following R packages for this project:

library(data.table)

# For viualization.
library(ggplot2)
library(ggrepel)
library(plotly)

# Fix macOS ggplot device to locate a Chinese font.
# To make `knitr` aware of this we also need to speficy `fig.showtext=TRUE` for chunks with ggplot output.
library(showtext)
font_add_google("Noto Serif TC", "noto")
showtext_auto()

# For spatial data visualization.
library(sf)

# For linear modeling with robust std err.
library(lmtest)
library(sandwich)

References on R Packages

Berger, Susanne, Nathaniel Graham, and Achim Zeileis. 2017. “Various Versatile Variances: An Object-Oriented Implementation of Clustered Covariances in R.” Working Paper 2017-12. Working Papers in Economics; Statistics, Research Platform Empirical; Experimental Economics, Universität Innsbruck. http://EconPapers.RePEc.org/RePEc:inn:wpaper:2017-12.

Dowle, Matt, and Arun Srinivasan. 2019. Data.table: Extension of ‘Data.frame‘. https://CRAN.R-project.org/package=data.table.

Pebesma, Edzer. 2018. “Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.

Qiu, Yixuan, and authors/contributors of the included software. See file AUTHORS for details. 2019. Showtext: Using Fonts More Easily in R Graphs. https://CRAN.R-project.org/package=showtext.

Sievert, Carson. 2018. Plotly for R. https://plotly-r.com.

Slowikowski, Kamil. 2019. Ggrepel: Automatically Position Non-Overlapping Text Labels with ’Gplot2’. https://CRAN.R-project.org/package=ggrepel.

Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.

Zeileis, Achim, and Torsten Hothorn. 2002. “Diagnostic Checking in Regression Relationships.” R News 2 (3): 7–10. https://CRAN.R-project.org/doc/Rnews/.

LS0tCnRpdGxlOiAiVmlzdWFsaXphdGlvbiBmb3IgVFcgR2VuZXJhbCBFbGVjdGlvbiIKc3VidGl0bGU6ICIyMDIwIFByZXNpZGVudGlhbCBhbmQgTGVnaXNsYXRpdmUgUmVzdWx0cyIKYXV0aG9yOgotIG5hbWU6IEt5bGUgQ2h1bmcKICBhZmZpbGlhdGlvbjoKZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJWIgJVknKWAgTGFzdCBVcGRhdGVkICgxOSBKYW4gMjAyMCBGaXJzdCBVcGxvYWRlZCkiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBmaWdfY2FwdGlvbjogeWVzCiAgICBmaWdfd2lkdGg6IDguMzMKICAgIGZpZ19oZWlnaHQ6IDYuMjUKICAgIGhpZ2hsaWdodDogdGFuZ28KICAgIGluY2x1ZGVzOgogICAgICBpbl9oZWFkZXI6IC90bXAvbWV0YV9oZWFkZXIuaHRtbAogICAgdGhlbWU6IHBhcGVyCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBjb2RlX2Rvd25sb2FkOiB0cnVlCmJpYmxpb2dyYXBoeTogdHdfZWxlY3Rpb25fMjAyMC5iaWIKbm9jaXRlOiB8CiAgQGRhdGEudGFibGUKICBAZ2dwbG90MgogIEBnZ3JlcGVsCiAgQHBsb3RseQogIEBzaG93dGV4dAogIEBzZgogIEBsbXRlc3QKICBAc2FuZHdpY2gKbGluay1jaXRhdGlvbnM6IHllcwphYnN0cmFjdDogfAogIFRoZSBub3RlYm9vayBwcm92aWRlcyBhIHZpc3VhbCBkZXNjcmlwdGlvbiBvbiB0aGUgMjAyMCBUYWl3YW5lc2UgcHJlc2lkZW50aWFsIGFuZCBsZWdpc2xhdGl2ZSBlbGVjdGlvbiByZXN1bHRzLiBUaGUgcG9sbGluZyB0b29rIHBsYWNlIGF0IDIwMjAtMDEtMTEgYW5kIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkIGJ5IENlbnRyYWwgRWxlY3Rpb24gQ29tbWlzaW9uIChDRUMpIGF0IHRoZSBwb2xsaW5nIHBsYWNlIGxldmVsLgotLS0KCmBgYHtyIG1ldGEsIGluY2x1ZGU9RkFMU0V9Cm1ldGFfaGVhZGVyX2ZpbGUgPC0gZmlsZSgiL3RtcC9tZXRhX2hlYWRlci5odG1sIikKCiMgQWRkIG9wZW4gZ3JhcGggbWV0YS4KbWV0YSA8LSBjKAogICc8bWV0YSBuYW1lPSJhdXRob3IiIGNvbnRlbnQ9Ikt5bGUgQ2h1bmciPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzp0aXRsZSIgY29udGVudD0iMjAyMCBUYWl3YW5lc2UgUHJlc2lkZW50aWFsIEVsZWN0aW9uIERhdGEiPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzp0eXBlIiBjb250ZW50PSJhcnRpY2xlIj4nLAogICc8bWV0YSBwcm9wZXJ0eT0ib2c6dXJsIiBjb250ZW50PSJodHRwczovL2V2ZXJkYXJrLmdpdGh1Yi5pby9rOS9wcm9qZWN0cy90d19lbGVjdGlvbl8yMDIwL3R3X2VsZWN0aW9uXzIwMjAubmIuaHRtbCI+JywKICAnPG1ldGEgcHJvcGVydHk9Im9nOmltYWdlIiBjb250ZW50PSJodHRwczovL2V2ZXJkYXJrLmdpdGh1Yi5pby9rOS9hc3NldHMvdHdfZWxlY3Rpb25fMjAyMC5wbmciPicsCiAgJzxtZXRhIHByb3BlcnR5PSJvZzpkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkYXRhIHNjaWVuY2Ugbm90ZWJvb2sgYWJvdXQgMjAyMCBUYWl3YW5lc2UgcHJlc2lkZW50aWFsIGVsZWN0aW9uLiI+JwopCmNvbnRlbnRzIDwtIG1ldGEKCiMgQWRkIEdpdGh1YiBjb3JuZXIuCmdpdGh1Yl9jb3JuZXJfc3ZnIDwtICIuLi8uLi9hc3NldHMvZ2l0aHViX2Nvcm5lci5odG1sIgpnaXRodWJfY29ybmVyX2NvbmYgPC0gbGlzdChnaXRodWJfbGluaz0iaHR0cHM6Ly9naXRodWIuY29tL2V2ZXJkYXJrL2s5L3RyZWUvbWFzdGVyL3Byb2plY3RzL3R3X2VsZWN0aW9uXzIwMjAiKQpjb250ZW50cyA8LSBjKGNvbnRlbnRzLCBzdHJpbmdyOjpzdHJfaW50ZXJwKHJlYWRMaW5lcyhnaXRodWJfY29ybmVyX3N2ZyksIGdpdGh1Yl9jb3JuZXJfY29uZikpCndyaXRlTGluZXMoY29udGVudHMsIG1ldGFfaGVhZGVyX2ZpbGUpCgpjbG9zZShtZXRhX2hlYWRlcl9maWxlKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLmFsaWduPSJjZW50ZXIiKQpgYGAKCiMgUHJlcmVxdWlzaXRlcyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIFBsYXRmb3JtCgpUaGUgc291cmNlIGRhdGEgY29udGFpbnMgdHJhZGl0aW9uYWwgQ2hpbmVzZSBjaGFyYWN0ZXJzIGVuY29kZWQgaW4gVVRGLTguClRvIGF2b2lkIHRyb3VibGVzb21lIGVuY29kaW5nIGlzc3VlcyAoZXNwZWNpYWxseSBpbiBhIFdpbmRvd3MgcGxhdGZvcm0gd2l0aCBhIGRlZmF1bHQgYENQMTI1MmAgY29kZSBwYWdlKSwKdGhlICoqY29kZXMgaW4gdGhpcyBub3RlYm9vayBhcmUgb25seSB0ZXN0ZWQgb24gVWJ1bnR1IGFuZCBtYWNPUy4qKgpDb2RlcyBhcmUgaW4gZ2VuZXJhbCBzdGlsbCB3b3JraW5nIHVuZGVyIFdpbmRvd3MuCkp1c3QgdGhhdCBzb21lIGNvZGUgY2h1bmtzIG1heSBub3QgYmUgYWJsZSB0byBwcmludCBvdXQgdW5pY29kZSBjaGFyYWN0ZXJzIG5pY2VseS4KCiMjIERhdGEKCiMjIyBFbGVjdGlvbiBEYXRhIHstfQoKV2UgdXNlIG1pbmltYWxseSBwcmUtcHJvY2Vzc2VkIGRhdGEgZm9yIG91ciBhbmFseXRpY3MuClBsZWFzZSByZWZlciB0byB0aGUgcmVwbyBbVFdfUHJlc2lkZW50aWFsX0VsZWN0aW9uXzIwMjBdKGh0dHBzOi8vZ2l0aHViLmNvbS9ldmVyZGFyay9UV19QcmVzaWRlbnRpYWxfRWxlY3Rpb25fMjAyMCkgZm9yIGRldGFpbHMgYWJvdXQgdGhlIHByZS1wcm9jZXNzaW5nIGxvZ2ljLgpUbyBkaXJlY3RseSBkb3dubG9hZCB0aGUgYXJjaGl2ZXMgcGxlYXNlIHZpc2l0IFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vZXZlcmRhcmsvVFdfUHJlc2lkZW50aWFsX0VsZWN0aW9uXzIwMjAvcmVsZWFzZXMvbGF0ZXN0KS4KV2UgcHV0IHRoZSB1bmNvbXByZXNzZWQgZmlsZXMgdW5kZXIgYGRhdGEvcHJvY2Vzc2VkYCBhdCBvdXIgcHJvamVjdCByb290IGRpcmVjdG9yeS4KCiMjIyBNYXAgRGF0YSB7LX0KCkZvciBUYWl3YW4gbWFwIGluZm9ybWF0aW9uLAp0aGUgYHNocGAgZmlsZSAoW3NoYXBlZmlsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2hhcGVmaWxlKSkgY2FuIGJlIGRvd25sb2FkZWQgYXQgW0dBRE0ub3JnXShodHRwczovL2dhZG0ub3JnL2Rvd25sb2FkX2NvdW50cnlfdjMuaHRtbCkuCldlIHB1dCB0aGUgdW56aXBwZWQgZmlsZXMgdW5kZXIgYGRhdGEvbWFwYCBhdCBvdXIgcHJvamVjdCByb290IGRpcmVjdG9yeS4KCiMjIERlcGVuZGVuY2llcwoKQWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgYXJlIHJlcXVpcmVkIGZvciBMaW51eCBtYWNoaW5lIGluIG9yZGVyIHRvIGRvIG1hcCBwbG90dGluZy4KSGVyZSBpcyB0aGUgaW5zdHJ1Y3Rpb24gZm9yIFVidW50dS4KCkluc3RhbGwgW2BnZGFsYF0oaHR0cHM6Ly9nZGFsLm9yZy8pOgoKYGBgc2gKc3VkbyBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOnVidW50dWdpcy91YnVudHVnaXMtdW5zdGFibGUKc3VkbyBhcHQgdXBkYXRlCnN1ZG8gYXB0IGluc3RhbGwgbGliZ2RhbC1kZXYKYGBgCgpJbnN0YWxsIGB1YnVuaXRzYDoKCmBgYHNoCnN1ZG8gYXB0IGluc3RhbGwgbGlidWR1bml0czItZGV2CmBgYAoKQWZ0ZXIgaW5zdGFsbGF0aW9uIG9mIHRoZSBhYm92ZSBwYWNrYWdlcywKd2UgY2FuIHRoZW4gaW5zdGFsbCBhbmQgaW1wb3J0IHRoZSBmb2xsb3dpbmcgUiBwYWNrYWdlcyBmb3IgdGhpcyBwcm9qZWN0OgoKYGBge3IgaW1wb3J0LCByZXN1bHRzPSJoaWRlIiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2xhc3Muc291cmNlPSJmb2xkLXNob3cifQpsaWJyYXJ5KGRhdGEudGFibGUpCgojIEZvciB2aXVhbGl6YXRpb24uCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KHBsb3RseSkKCiMgRml4IG1hY09TIGdncGxvdCBkZXZpY2UgdG8gbG9jYXRlIGEgQ2hpbmVzZSBmb250LgojIFRvIG1ha2UgYGtuaXRyYCBhd2FyZSBvZiB0aGlzIHdlIGFsc28gbmVlZCB0byBzcGVmaWN5IGBmaWcuc2hvd3RleHQ9VFJVRWAgZm9yIGNodW5rcyB3aXRoIGdncGxvdCBvdXRwdXQuCmxpYnJhcnkoc2hvd3RleHQpCmZvbnRfYWRkX2dvb2dsZSgiTm90byBTZXJpZiBUQyIsICJub3RvIikKc2hvd3RleHRfYXV0bygpCgojIEZvciBzcGF0aWFsIGRhdGEgdmlzdWFsaXphdGlvbi4KbGlicmFyeShzZikKCiMgRm9yIGxpbmVhciBtb2RlbGluZyB3aXRoIHJvYnVzdCBzdGQgZXJyLgpsaWJyYXJ5KGxtdGVzdCkKbGlicmFyeShzYW5kd2ljaCkKYGBgCgojIEJhY2tncm91bmQKCisgWzIwMjAgMTV0aCBUYWl3YW5lc2UgUHJlc2lkZW50aWFsIEVsZWN0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS8yMDIwX1RhaXdhbmVzZV9wcmVzaWRlbnRpYWxfZWxlY3Rpb24pCisgWzIwMjAgMTB0aCBUYWl3YW5lc2UgTGVnaXNsYXRpdmUgRWxlY3Rpb25dKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLzIwMjBfVGFpd2FuZXNlX2xlZ2lzbGF0aXZlX2VsZWN0aW9uKQoKIyBWaXN1YWwgQW5hbHl0aWNzIG9uIEVsZWN0aW9uIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHMgI2hlYWR9CgojIyDnrKzljYHkupTlsYbnuL3ntbHpgbjoiInntZDmnpwgVGhlIDE1dGggUHJlc2lkZW50aWFsIEVsZWN0aW9uIFJlc3VsdHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgojIyMg5pyJ5pWI56WoIFZhbGlkIFZvdGUgQ291bnRzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKIyMjIyBCeSBDb3VudHkKCmBgYHtyIHBhcnNlX3R3X2NvdW50eV9tYXB9CiMgUmVhZCBzaGFwZWZpbGUgZm9yIHNwYXRpYWwgaW5mb3JtYXRpb24gYWJvdXQgY291bnRpZXMgaW4gVGFpd2FuLgp0d19jb3VudHlfc2YgPC0gc2Y6OnN0X3JlYWQoImRhdGEvbWFwL2dhZG0zNl9UV05fMi5zaHAiLCBxdWlldD1UUlVFKQoKIyBBbGlnbiBjb3VudHkgbmFtaW5nLgp0d19jb3VudHlfc2YkTkxfTkFNRV8yIDwtIGdzdWIoIuWPsOS4rSIsICLlj7DkuK3luIIiLCB0d19jb3VudHlfc2YkTkxfTkFNRV8yKQp0d19jb3VudHlfc2YkTkxfTkFNRV8yIDwtIGdzdWIoIuWPsOWNlyIsICLlj7DljZfluIIiLCB0d19jb3VudHlfc2YkTkxfTkFNRV8yKQp0d19jb3VudHlfc2YkTkxfTkFNRV8yIDwtIGdzdWIoIummrOelluWIl+WztiIsICLpgKPmsZ/nuKMiLCB0d19jb3VudHlfc2YkTkxfTkFNRV8yKQpgYGAKCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX2NvdW50eSwgcmVzdWx0cz0iaGlkZSJ9CiMgcHJvY2VzcyBjb3VudHktbGV2ZWwgcHJlc2lkZW50aWFsIGVsZWN0aW9uIHJlc3VsdHMuCnBfY291bnR5IDwtIGZyZWFkKCJkYXRhL3Byb2Nlc3NlZC9wcmVzaWRlbnRpYWwvcHJlc2lkZW50aWFsX2NvdW50aWVzLmNzdiIsIGVuY29kaW5nPSJVVEYtOCIpCnBfY291bnR5IDwtIHBfY291bnR5WywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCnBfY291bnR5IDwtIHBfY291bnR5WywgUmVnaW9uOj1nc3ViKCLoh7oiLCAi5Y+wIiwgUmVnaW9uKV0gICMgQWxpZ24gY2hhcmFjdGVyIHdpdGggc2hhcGVmaWxlLgpzZXRuYW1lcyhwX2NvdW50eSwgIuaKleelqOeOh0ggSD1Dw7dHIiwgIlR1cm5vdXQiKQoKIyBGaW5hbCBjb3VudHMuCmNvbHNfY2FuZGlkYXRlIDwtIGMoIigxKSDlrovmpZrnkZwg5L2Z5rmYIiwgIigyKSDpn5PlnIvnkZwg5by15ZaE5pS/IiwgIigzKSDolKHoi7Hmlocg6LO05riF5b63IikKcF9maW5hbCA8LSBhcy5kYXRhLnRhYmxlKGNvbFN1bXMocF9jb3VudHlbLCBjb2xzX2NhbmRpZGF0ZSwgd2l0aD1GQUxTRV0pLCBrZWVwLnJvd25hbWVzPVRSVUUpCnNldG5hbWVzKHBfZmluYWwsIGMoIkNhbmRpZGF0ZSIsICJWb3RlcyIpKQpwX2ZpbmFsIDwtIHBfZmluYWxbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpXQoKIyBNZXJnZSB3aXRoIHNocCB0byBnZXQgRW5nbGlzaCBjb3VudHkgbmFtZS4KcF9jb3VudHkgPC0gbWVyZ2UocF9jb3VudHksIHR3X2NvdW50eV9zZlssIGMoIk5MX05BTUVfMiIsICJOQU1FXzIiKV0sCiAgICAgICAgICAgICAgICAgIGJ5Lnk9Ik5MX05BTUVfMiIsIGJ5Lng9IlJlZ2lvbiIpCnBfY291bnR5JGdlb21ldHJ5IDwtTlVMTApzZXRuYW1lcyhwX2NvdW50eSwgIk5BTUVfMiIsICJSZWdpb25FbiIpCnBfY291bnR5IDwtIHBfY291bnR5WywgQ291bnR5Oj1wYXN0ZShSZWdpb24sIFJlZ2lvbkVuKV0KCiMgTWVsdCBmcm9tIHdpZGUgdG8gbG9uZyBmb3IgcGxvdHRpbmcgcHVycG9zZS4KY29sc19yZWdpb24gPC0gYygiQ291bnR5IiwgIlJlZ2lvbiIsICJSZWdpb25FbiIpCnBfY291bnR5X2wgPC0gbWVsdChwX2NvdW50eVssIGMoY29sc19yZWdpb24sIGNvbHNfY2FuZGlkYXRlKSwgd2l0aD1GQUxTRV0sCiAgICAgICAgICAgICAgICAgICBpZC52YXJzPWNvbHNfcmVnaW9uLCB2YXJpYWJsZS5uYW1lPSJDYW5kaWRhdGUiLCB2YWx1ZS5uYW1lPSJWb3RlcyIpCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIENhbmRpZGF0ZTo9ZmFjdG9yKENhbmRpZGF0ZSldICAjIExldmVsIGJ5IGNhbmRpZGF0ZSBudW1iZXIuCgojIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIERQUCBhbmQgS01UIGJ5IGNvdW50eS4Kc2V0b3JkZXIocF9jb3VudHlfbCwgQ291bnR5LCBDYW5kaWRhdGUpCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIFZvdGVzX0RpZmY6PVZvdGVzWzNdIC0gVm90ZXNbMl0sIGJ5PS4oQ291bnR5KV0KCiMgQ29tcHV0ZSB0b3RhbCB2b3RlcyBieSBjb3VudHkuCnBfY291bnR5X2wgPC0gcF9jb3VudHlfbFssIFRvdGFsX1ZvdGVzOj1zdW0oVm90ZXMpLCBieT0uKENvdW50eSldCgojIENvbXB1dGUgc2hhcmUgYnkgY291bnR5LgpwX2NvdW50eV9sIDwtIHBfY291bnR5X2xbLCBWb3Rlc19TaGFyZTo9Vm90ZXMgLyBUb3RhbF9Wb3Rlc10KcF9jb3VudHlfbCA8LSBwX2NvdW50eV9sWywgU2hhcmVfRGlmZjo9Vm90ZXNfU2hhcmVbM10gLSBWb3Rlc19TaGFyZVsyXSwgYnk9LihDb3VudHkpXQpwX2NvdW50eV9kaWZmIDwtIHVuaXF1ZShwX2NvdW50eV9sLCBieT0iQ291bnR5IilbCiAgLCBjKGNvbHNfcmVnaW9uLCAiVG90YWxfVm90ZXMiLCAiU2hhcmVfRGlmZiIpLCB3aXRoPUZBTFNFXQpwX2NvdW50eV9kaWZmIDwtIHBfY291bnR5X2RpZmZbLCBkcHBfd2luOj1TaGFyZV9EaWZmID4gMF0KCiMgSm9pbiBzaGFyZSBkaWZmIHRvIHNwYXRpYWwgZGF0YWZyYW1lLgp0d19jb3VudHlfc2YgPC0gbWVyZ2UodHdfY291bnR5X3NmLCBwX2NvdW50eV9kaWZmLCBieS54PSJOTF9OQU1FXzIiLCBieS55PSJSZWdpb24iKQoKIyBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBEUFAgYW5kIEtNVCBvbiB0aGUgd2lkZSBkYXRhIGFzIHdlbGwuCnBfY291bnR5IDwtIHBfY291bnR5WywgVm90ZV9EaWZmOj1nZXQoIigzKSDolKHoi7Hmlocg6LO05riF5b63IikgLSBnZXQoIigyKSDpn5PlnIvnkZwg5by15ZaE5pS/IildCnBfY291bnR5IDwtIHBfY291bnR5WywgU2hhcmVfRGlmZjo9Vm90ZV9EaWZmIC8gZ2V0KCLmnInmlYjnpajmlbhBIEE9MSsyKy4uLitOIildCgojIENvbG9yIGNvbmZpZ3VyYXRpb24gZm9yIG1haW4gcGFydGllcy4KbWFpbl9wYXJ0eV9jb2xvcnMgPC0gYygiZGFya29yYW5nZSIsICJkb2RnZXJibHVlIiwgImdyZWVuMyIpCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX2ZpbmFsX3Jlc3VsdCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9NCwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gRmluYWwgT3V0Y29tZSJ9CmdncGxvdChwX2ZpbmFsLCBhZXMoeD1DYW5kaWRhdGUsIHk9Vm90ZXMsIGZpbGw9Q2FuZGlkYXRlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IikgKwogIGxhYnMoeD0i5YCZ6YG45Lq6IiwgeT0i5b6X56Wo5pW4IiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG457WQ5p6cIikgKwogIGdlb21fdGV4dChhZXMoeD1DYW5kaWRhdGUsIHk9Vm90ZXMgLyAyLAogICAgICAgICAgICAgICAgbGFiZWw9c3ByaW50ZigiJXNcbiglcykiLCBzY2FsZXM6OmNvbW1hKFZvdGVzKSwgc2NhbGVzOjpwZXJjZW50KFNoYXJlKSkpLAogICAgICAgICAgICBzaXplPTUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6Y29tbWEpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKVGhlIHByZS1wcm9jZXNzZWQgY291bnR5IHJlc3VsdCBmb3IgcHJlc2lkZW50aWFsIGVsZWN0aW9uIGlzIGEgKndpZGUqIGZvcm1hdCBieSBjb3VudHk6CgpgYGB7ciBzaG93X3ByZXNpZGVudGlhbF9jb3VudHlfcmVzdWx0fQpoZWFkKHBfY291bnR5WywgLWMoMTozKV0pCmBgYAoKQW5kIHdlJ3ZlIHJlc2hhcGVkIGl0IGludG8gYSAqbG9uZyogZm9ybWF0IGZvciBlYXNlIG9mIHBsb3R0aW5nOgoKYGBge3Igc2hvd19wcmVzaWRlbnRpYWxfdGFpZXBpfQojIFNob3cgcmVzdWx0IGZvciBUYWlwZWkuCnBfY291bnR5X2xbUmVnaW9uID09ICLlj7DljJfluIIiXQpgYGAKClBsb3Qgdm90ZSBjb3VudHMgYnkgY291bnR5OgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9iYXIsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGUgQ291bnRzIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5X2wsIGFlcyh4PXJlb3JkZXIoQ291bnR5LCBUb3RhbF9Wb3RlcyksIHk9Vm90ZXMsIGZpbGw9Q2FuZGlkYXRlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249ImRvZGdlIiwgd2lkdGg9LjgpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSLlgJnpgbjkuroiLCB2YWx1ZXM9bWFpbl9wYXJ0eV9jb2xvcnMpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6Y29tbWEpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+nee4veelqOaVuOaOkuW6j++8iSIsIHk9IuW+l+elqOaVuCIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWAmemBuOS6uuWQhOe4o+W4gu+8muW+l+elqOaVuCIpICsKICBjb29yZF9mbGlwKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0iYm90dG9tIikKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpBbmQgYWxzbyB2b3RlIHNoYXJlcyAodm90ZSBjb3VudHMgLyB0b3RhbCB2YWxpZCB2b3Rlcyk6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X2Jhcl9wY3QsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGUgU2hhcmVzIGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5X2wsIGFlcyh4PXJlb3JkZXIoQ291bnR5LCBUb3RhbF9Wb3RlcyksIHk9Vm90ZXNfU2hhcmUsIGZpbGw9Q2FuZGlkYXRlKSkgKwogIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5IiwgcG9zaXRpb249InN0YWNrIiwgd2lkdGg9LjgpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChWb3Rlc19TaGFyZSkpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9MikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWU9IuWAmemBuOS6uiIsIHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogIGxhYnMoeD0i57ij5biC77yI5L6d57i956Wo5pW45o6S5bqP77yJIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45YCZ6YG45Lq65ZCE57ij5biC77ya5b6X56Wo546HIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJib3R0b20iKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKClNpbmNlIHRoZSBtYWluIHBhcnRpZXMgYXJlIEREUCBhbmQgS01ULAp3ZSBkZWZpbmUgdm90ZSBzaGFyZSBkaWZmZXJlbmNlIGFzIHZvdGUgc2hhcmUgb2YgRERQIG1pbnVzIHRoYXQgb2YgS01ULgpUaGUgZm9sbG93aW5nIGJhcnBsb3QgZ2l2ZXMgdXMgYSBjbGVhciB2aWV3IG9mIHdoaWNoIGNvdW50eSBEUFAgd29uIHRoZSBtb3N0LgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9iYXJfcGN0X2RpZmYsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGUgU2hhcmUgRGlmZmVyZW5jZSAoRFBQJ3MgLSBLTVQncykgYnkgQ291bnR5In0KcCA8LSBnZ3Bsb3QocF9jb3VudHlfZGlmZiwgYWVzKHg9cmVvcmRlcihDb3VudHksIFNoYXJlX0RpZmYpLCBmaWxsPWRwcF93aW4sIHk9U2hhcmVfRGlmZikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS44LCBjb2xvcj0iYmxhY2siLCBhbHBoYT0uNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJkb2RnZXJibHVlIiwgImdyZWVuMyIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KFNoYXJlX0RpZmYpKSwgcG9zaXRpb249cG9zaXRpb25fc3RhY2sodmp1c3Q9LjUpLCBzaXplPTIuNSkgKwogIGxhYnMoeD0i57ij5biC77yI5L6d5b6X56Wo546H5beu5o6S5bqP77yJIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya57ag6JeN5b6X56Wo546H5beuIikgKwogIGNvb3JkX2ZsaXAoKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKCldlIGNhbiBhbHNvIHZpc3VhbGl6ZSB0aGUgYWJvdmUgcmFua2luZyB3aXRoIGEgY2hvcm9wbGV0aCBtYXA6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X21hcCwgZmlnLmNhcD0iQ2hvcm9wbGV0aCBNYXAgZm9yIFZvdGUgU2hhcmUgRGlmZmVyZW5jZXMgKERQUCdzIC0gS01UJ3MpIn0KcCA8LSBnZ3Bsb3QodHdfY291bnR5X3NmLCBhZXModGV4dD1Db3VudHkpKSArCiAgZ2VvbV9zZihhZXMoZmlsbD1TaGFyZV9EaWZmKSkgKwogIGNvb3JkX3NmKHhsaW09YygxMTgsIDEyMi41KSwgeWxpbT1jKDIxLjUsIDI2LjUpKSArCiAgc2NhbGVfZmlsbF9ncmFkaWVudChuYW1lPSLntqDol43lvpfnpajnjoflt64iLCBsb3c9ImJsdWUzIiwgaGlnaD0iZ3JlZW4zIikgKwogIGxhYnModGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrntqDol43lvpfnpajnjoflt64iKQoKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKCkFwcGFyZW50bHkgRFBQIHdvbiBtb3N0IGNvdW50aWVzIGJlc2lkZXMgbWFpbnRhaW4gYW5kIG91dGx5aW5nIGlzbGFuZCBhcmVhcy4KCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IENvdW50eSBTdWItUmVnaW9uIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfcmVnaW9uLCByZXN1bHRzPSJoaWRlIn0KIyBSZWFkIGNvdW50eSBzdWJyZWdpb24tbGV2ZWwgcHJlc2lkZW50aWFsIGVsZWN0aW9uIHJlc3VsdHMuCnBfcmVnaW9uIDwtIGZyZWFkKCJkYXRhL3Byb2Nlc3NlZC9wcmVzaWRlbnRpYWwvcHJlc2lkZW50aWFsX3JlZ2lvbnMuY3N2IiwgZW5jb2Rpbmc9IlVURi04IikKcF9yZWdpb24gPC0gcF9yZWdpb25bLCBSZWdpb246PXRyaW13cyhSZWdpb24sIHdoaXRlc3BhY2U9IltcXGhcXHZdIildICAjIFRyaW0gZnVsbC13aWR0aCB3aGl0ZSBzcGFjZS4Kc2V0bmFtZXMocF9yZWdpb24sICLmipXnpajnjodIIEg9Q8O3RyIsICJUdXJub3V0IikKCiMgQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gRFBQIGFuZCBLTVQgYnkgcmVnaW9uLgpwX3JlZ2lvbiA8LSBwX3JlZ2lvblssIFZvdGVfRGlmZjo9Z2V0KCIoMykg6JSh6Iux5paHIOiztOa4heW+tyIpIC0gZ2V0KCIoMikg6Z+T5ZyL55GcIOW8teWWhOaUvyIpXQpwX3JlZ2lvbiA8LSBwX3JlZ2lvblssIFNoYXJlX0RpZmY6PVZvdGVfRGlmZiAvIGdldCgi5pyJ5pWI56Wo5pW4QSBBPTErMisuLi4rTiIpXQoKIyBXaWRlIHRvIGxvbmcuCnBfcmVnaW9uX2wgPC0gbWVsdChwX3JlZ2lvblssIGMoIkJ5IiwgIlJlZ2lvbiIsIGNvbHNfY2FuZGlkYXRlKSwgd2l0aD1GQUxTRV0sCiAgICAgICAgICAgICAgICAgICBpZC52YXJzPWMoIkJ5IiwgIlJlZ2lvbiIpLCB2YXJpYWJsZS5uYW1lPSJDYW5kaWRhdGUiLCB2YWx1ZS5uYW1lPSJWb3RlcyIpCnBfcmVnaW9uX2wgPC0gcF9yZWdpb25fbFssIENhbmRpZGF0ZTo9ZmFjdG9yKENhbmRpZGF0ZSldICAjIExldmVsIGJ5IGNhbmRpZGF0ZSBudW1iZXIuCnBfcmVnaW9uX2wgPC0gcF9yZWdpb25fbFtwX3JlZ2lvbiwgU2hhcmVfRGlmZjo9aS5TaGFyZV9EaWZmLCBvbj0uKFJlZ2lvbildCgpzZXRvcmRlcihwX3JlZ2lvbiwgLVNoYXJlX0RpZmYpCgojIEdyb3VwIGNvdW50aWVzIGludG8gYXJlYXMuCm5vcnRoX2NvdW50aWVzIDwtIGMoIuiHuuWMl+W4giIsICLmlrDljJfluIIiLCAi5Z+66ZqG5biCIiwgIuaWsOerueW4giIsICLmoYPlnJLluIIiLCAi5paw56u557ijIiwgIuWunOiYree4oyIpCmNlbnRyYWxfY291bnRpZXMgPC0gYygi6Ie65Lit5biCIiwgIuiLl+agl+e4oyIsICLlvbDljJbnuKMiLCAi5Y2X5oqV57ijIiwgIumbsuael+e4oyIpCnNvdXRoX2NvdW50aWVzIDwtIGMoIumrmOmbhOW4giIsICLoh7rljZfluIIiLCAi5ZiJ576p5biCIiwgIuWYiee+qee4oyIsICLlsY/mnbHnuKMiLCAi5r6O5rmW57ijIikKZWFzdF9jb3VudGllcyA8LSBjKCLoirHok67nuKMiLCAi6Ie65p2x57ijIikKaXNsYW5kX2NvdW50aWVzIDwtIGMoIumHkemWgOe4oyIsICLpgKPmsZ/nuKMiKQoKIyBIZWxwZXIgZnVuY3Rpb24gZm9yIHNoYXJlIGRpZmZlcmVuY2UgYmFyIHBsb3QuCnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYgPC0gZnVuY3Rpb24oY291bnRpZXMsIHRpdGxlKSB7CiAgRFQgPC0gcF9yZWdpb25bQnkgJWluJSBjb3VudGllc10KICBEVFssIEJ5Oj1mYWN0b3IoQnksIGxldmVscz1jb3VudGllcyldICAjIEZpeCBvcmRlciBmb3IgZmFjZXQgZ3JpZHMuCiAgRFRbLCBSZWdpb24yOj1wYXN0ZShCeSwgUmVnaW9uKV0gICMgRml4ZWQgb3JkZXIgd2l0aGluIGZhY2V0IChzYW1lLW5hbWUgcmVnaW9uIGZvciBkaWZmZXJlbnQgY291bnRpZXMpLgogIERUWywgZHBwX3dpbjo9U2hhcmVfRGlmZiA+IDBdCiAgcCA8LSBnZ3Bsb3QoRFQsIGFlcyh4PXJlb3JkZXIoUmVnaW9uMiwgU2hhcmVfRGlmZiksIHk9U2hhcmVfRGlmZiwgZmlsbD1kcHBfd2luKSkgKwogICAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgY29sb3I9ImJsYWNrIiwgYWxwaGE9LjUpICsKICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1jKCJkb2RnZXJibHVlIiwgImdyZWVuMyIpKSArCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChTaGFyZV9EaWZmKSksIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PS41KSwgc2l6ZT0yLjUpICsKICAgIGxhYnMoeD0iIiwgeT0iIiwgdGl0bGU9dGl0bGUpICsKICAgIGNvb3JkX2ZsaXAoKSArCiAgICBmYWNldF9ncmlkKEJ5IH4gLiwgc2NhbGVzPSJmcmVlX3kiLCBzcGFjZT0iZnJlZV95IikKICBwCn0KYGBgCgpWb3RlIHNoYXJlIGRpZmZlcmVuY2UgKERQUCB2LnMuIEtNVCkgcmFua2VkIGJ5IHJlZ2lvbiBhY3Jvc3MgdGhlIG5hdGlvbjoKCmBgYHtyIHNoYXJlX2RpZmZfcmFua19ieV9yZWdpb259CnBfcmVnaW9uX3JhbmsgPC0gcF9yZWdpb25bLCAuKEJ5LCBSZWdpb24sIFNoYXJlX0RpZmYsIFZvdGVfRGlmZildCnBfcmVnaW9uX3JhbmsgPC0gcF9yZWdpb25fcmFua1ssIFNoYXJlX0RpZmY6PXNjYWxlczo6cGVyY2VudChTaGFyZV9EaWZmLCAuMDAxKV0KcF9yZWdpb25fcmFuayA8LSBwX3JlZ2lvbl9yYW5rWywgaTo9LkldCnNldGNvbG9yZGVyKHBfcmVnaW9uX3JhbmssICJpIikKc2V0bmFtZXMocF9yZWdpb25fcmFuaywgYygi5o6S5bqPIiwgIue4o+W4giIsICLphInpjq7luILljYAiLCAi57ag6JeN5b6X56Wo546H5beuIiwgIue2oOiXjeW+l+elqOaVuOW3riIpKQpwX3JlZ2lvbl9yYW5rW10KYGBgCgpXZSBiYXItcGxvdCB0aGUgYWJvdmUgcmFua2luZyBieSByZWdpb24gYnkgY291bnR5OgoKIyMjIyMgTm9ydGggVGFpd2FuCgpgYGB7ciBwcmVzaWRlbnRpYWxfbm9ydGhfcmVnaW9uX2Jhcl9wY3RfZGlmZiwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9MTcsIGZpZy53aWR0aD04fQpwbG90X3JlZ2lvbl9zaGFyZV9kaWZmKAogIG5vcnRoX2NvdW50aWVzLAogIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45YyX6YOo5Zyw5Y2A77yI6YSJ6Y6u5biC5Y2A77yJ77ya57ag6JeN5b6X56Wo546H5beuIikKYGBgCgojIyMjIyBDZW50cmFsIFRhaXdhbgoKYGBge3IgcHJlc2lkZW50aWFsX2NlbnRyYWxfcmVnaW9uX2Jhcl9wY3RfZGlmZiwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9MjAsIGZpZy53aWR0aD04fQpwbG90X3JlZ2lvbl9zaGFyZV9kaWZmKAogIGNlbnRyYWxfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjkuK3pg6jlnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyMjIFNvdXRoIFRhaXdhbgoKYGBge3IgcHJlc2lkZW50aWFsX3NvdXRoX3JlZ2lvbl9iYXJfcGN0X2RpZmYsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTIyLCBmaWcud2lkdGg9OH0KcGxvdF9yZWdpb25fc2hhcmVfZGlmZigKICBzb3V0aF9jb3VudGllcywKICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWNl+mDqOWcsOWNgO+8iOmEiemOruW4guWNgO+8ie+8mue2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKIyMjIyMgRWFzdCBUYWl3YW4KCmBgYHtyIHByZXNpZGVudGlhbF9lYXN0X3JlZ2lvbl9iYXJfcGN0X2RpZmYsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD04fQpwbG90X3JlZ2lvbl9zaGFyZV9kaWZmKAogIGVhc3RfY291bnRpZXMsCiAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjmnbHpg6jlnLDljYDvvIjphInpjq7luILljYDvvInvvJrntqDol43lvpfnpajnjoflt64iKQpgYGAKCiMjIyMjIE91dGx5aW5nIElzbGFuZHMKCmBgYHtyIHByZXNpZGVudGlhbF9pc2xhbmRfcmVnaW9uX2Jhcl9wY3RfZGlmZiwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5oZWlnaHQ9MywgZmlnLndpZHRoPTh9CnBsb3RfcmVnaW9uX3NoYXJlX2RpZmYoCiAgaXNsYW5kX2NvdW50aWVzLAogIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG46Zui5bO25Zyw5Y2A77yI6YSJ6Y6u5biC5Y2A77yJ77ya57ag6JeN5b6X56Wo546H5beuIikKYGBgCgojIyMg54Sh5pWI56WoIEludmFsaWQgVm90ZSBDb3VudHMgey50YWJzZXQgLnRhYnNldC1mYWRlIC50YWJzZXQtcGlsbHN9CgpbSW52YWxpZCB2b3Rlc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3BvaWx0X3ZvdGUpIGFyZSB2b3RlcyBjYXN0IGJ1dCBkZWNsYXJlZCBpbnZhbGlkLgpUaGVyZSBpcyBubyB3YXkgdG8gb2JqZWN0aXZlbHkgcmVjb3JkIHRoZSBpbnRlbnRpb24gb2YgYW4gaW52YWxpZCB2b3RlLApoZXJlIHdlIHNpbXBseSBzdGF0aXN0aWNhbGx5IGRlc2NyaWJlIHRoZSBzaGFyZSBvZiBpbnZhbGlkIHZvdGVzIGZyb20gdG90YWwgdm90ZXMgY2FzdC4KCiMjIyMgQnkgQ291bnR5CgpgYGB7ciBwcm9jZXNzX3ByZXNpZGVudGlhbF9pbnZhbGlkX3ZvdGVzX2NvdW50eSwgcmVzdWx0cz0iaGlkZSJ9CiMgUHJvY2VzcyBpbnZhbGlkIHZvdGVzIGJ5IGNvdW50eS4KcF9jb3VudHkgPC0gcF9jb3VudHlbLCBJbnZhbGlkX1ZvdGVzX1NoYXJlOj1nZXQoIueEoeaViOelqOaVuEIiKSAvIGdldCgi5oqV56Wo5pW4QyBDPUErQiIpXQpwX2NvdW50eSA8LSBwX2NvdW50eVssIEludmFsaWRfVm90ZXNfU2hhcmVQOj1JbnZhbGlkX1ZvdGVzX1NoYXJlICogMTAwXQoKIyBKb2luIGludmFsaWQgdm90ZSBzaGFyZXMgdG8gc3BhdGlhbCBkYXRhZnJhbWUuCnR3X2NvdW50eV9zZiA8LSBtZXJnZSh0d19jb3VudHlfc2YsIHBfY291bnR5WywgLihSZWdpb24sIEludmFsaWRfVm90ZXNfU2hhcmVQKV0sIGJ5Lng9Ik5MX05BTUVfMiIsIGJ5Lnk9IlJlZ2lvbiIpCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV9iYXJfcGN0X2ludmFsaWQsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIEludmFsaWQgVm90ZSBTaGFyZXMgYnkgQ291bnR5In0KcCA8LSBnZ3Bsb3QocF9jb3VudHksIGFlcyh4PXJlb3JkZXIoQ291bnR5LCBJbnZhbGlkX1ZvdGVzX1NoYXJlKSwgeT1JbnZhbGlkX1ZvdGVzX1NoYXJlUCkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS44LCBmaWxsPSJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChJbnZhbGlkX1ZvdGVzX1NoYXJlKSksIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PS41KSwgc2l6ZT0yLjUpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+neW7ouelqOeOh+aOkuW6j++8iSIsIHk9IuW7ouelqOeOh++8hSIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muW7ouelqOeOhyIpICsKICBjb29yZF9mbGlwKCkKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpUbyBzZWUgdGhlIGdlb2xvY2F0aW9uYWwgZGlmZmVyZW5jZXM6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X21hcF9pbnZhbGlkLCBmaWcuY2FwPSJDaG9yb3BsZXRoIE1hcCBmb3IgSW52YWxpZCBWb3RlIFNoYXJlcyJ9CnAgPC0gZ2dwbG90KHR3X2NvdW50eV9zZiwgYWVzKHRleHQ9Q291bnR5KSkgKwogIGdlb21fc2YoYWVzKGZpbGw9SW52YWxpZF9Wb3Rlc19TaGFyZVApKSArCiAgY29vcmRfc2YoeGxpbT1jKDExOCwgMTIyLjUpLCB5bGltPWMoMjEuNSwgMjYuNSkpICsKICBzY2FsZV9maWxsX2dyYWRpZW50KG5hbWU9IuW7ouelqOeOh++8hSIsIGxvdz0id2hpdGUiLCBoaWdoPSJibGFjayIpICsKICBsYWJzKHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5bui56Wo546H77yFIikKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpDaGVjayBpZiB0aGVyZSBpcyBhbnkgY29ycmVsYXRpb24gYmV0d2VlbiBpbnZhbGlkIHZvdGVzIGFuZCB0aGUgRFBQLUtNVCBkaWZmZXJlbmNlczoKCmBgYHtyIHByZXNpZGVudGlhbF9pbnZhbGlkX3ZzZF9jb3VudHksIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBJbnZhbGlkIFZvdGUgU2hhcmVzIHZzIERQUC1LTVQgU2hhcmUgRGlmZmVyZW5jZXMgYnkgQ291bnR5In0KZ2dwbG90KHBfY291bnR5LCBhZXMoeD1JbnZhbGlkX1ZvdGVzX1NoYXJlLCB5PVNoYXJlX0RpZmYsIGxhYmVsPUNvdW50eSkpICsKICBnZW9tX3BvaW50KHNoYXBlPTQsIHNpemU9NCwgc3Ryb2tlPTIpICsKICBsYWJzKHg9IuW7ouelqOeOhyIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muW7ouelqOeOh++8uOe2oOiXjeW+l+elqOeOh+W3riIpICsKICBnZW9tX3RleHRfcmVwZWwoY29sb3I9ImdyZXk0MCIpCmBgYAoKW0dvIEJhY2sgdG8gVG9wXSgjaGVhZCkKCiMjIyMgQnkgQ291bnR5IFN1Yi1SZWdpb24KCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX2ludmFsaWRfdm90ZXNfcmVnaW9uLCByZXN1bHRzPSJoaWRlIn0KIyBQcm9jZXNzIGludmFsaWQgdm90ZXMgYnkgcmVnaW9uLgpwX3JlZ2lvbiA8LSBwX3JlZ2lvblssIEludmFsaWRfVm90ZXNfU2hhcmU6PWdldCgi54Sh5pWI56Wo5pW4QiIpIC8gZ2V0KCLmipXnpajmlbhDIEM9QStCIildCnBfcmVnaW9uIDwtIHBfcmVnaW9uWywgSW52YWxpZF9Wb3Rlc19TaGFyZVA6PUludmFsaWRfVm90ZXNfU2hhcmUgKiAxMDBdCmBgYAoKYGBge3IgcHJlc2lkZW50aWFsX2ludmFsaWRfdnNkX3JlZ2lvbiwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gSW52YWxpZCBWb3RlIFNoYXJlcyB2cyBEUFAtS01UIFNoYXJlIERpZmZlcmVuY2VzIGJ5IFJlZ2lvbiJ9CnAgPC0gZ2dwbG90KHBfcmVnaW9uLCBhZXMoeD1JbnZhbGlkX1ZvdGVzX1NoYXJlLCB5PVNoYXJlX0RpZmYsIGxhYmVsPXBhc3RlKEJ5LCBSZWdpb24pKSkgKwogIGdlb21fcG9pbnQoc2hhcGU9NCwgc2l6ZT00KSArCiAgbGFicyh4PSLlu6LnpajnjociLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITphInpjq7luILljYDvvJrlu6LnpajnjofvvLjntqDol43lvpfnpajnjoflt64iKSArCiAgICAgICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgY29sb3I9ImJsYWNrIikKZ2dwbG90bHkocCwgd2lkdGg9ODAwLCBoZWlnaHQ9NjAwKQpgYGAKCkEgc2ltcGxlIGxpbmVhciBtb2RlbCBvbiBpbnZhbGlkIHZvdGUgc2hhcmVzIGFnYWluc3QgRFBQLUtNVCBzaGFyZSBkaWZmZXJlbmNlcyBzdWdnZXN0cyB0aGUgY29ycmVsYXRpb24gaXMgYXQgbGVhc3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4KQnV0IHN1Y2ggY29ycmVsYXRpb24gbWF5IGJlIFsqc3B1cmlvdXMqXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcHVyaW91c19yZWxhdGlvbnNoaXApIHNvIHRoZSBpbnRlcnByZXRhdGlvbiBzaGFsbCBiZSBjYXV0aW91cy4KCmBgYHtyIGxtX2ludmFsaWR9CmxtX2ludmFsaWQgPC0gbG0oU2hhcmVfRGlmZiB+IEludmFsaWRfVm90ZXNfU2hhcmVQLCBkYXRhPXBfcmVnaW9uKQpjb2VmdGVzdChsbV9pbnZhbGlkLCB2Y292PXZjb3ZIQyhsbV9pbnZhbGlkLCB0eXBlPSJIQzAiKSkKYGBgCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIOaKleelqOeOhyBWb3RlciBUdXJub3V0IHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQoKW1ZvdGVyIHR1cm5vdXRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZvdGVyX3R1cm5vdXQpIGlzIGRlZmluZWQgYXMgdG90YWwgdm90ZXMgY2FzdCAodmFsaWQgYW5kIGludmFsaWQpIGRpdmlkZWQgYnkgbGVnaXRpbWF0ZSB2b3RlcnMuClRoZSBpbmZvcm1hdGlvbiBpcyByZWFkaWx5IGF2YWlsYWJsZSBpbiB0aGUgc291cmNlIGRhdGEgZnJvbSB0aGUgY29sdW1uIGDmipXnpajnjodIIEg9Q8O3R2AuCkluIHRoaXMgc2VjdGlvbiB3ZSBleHBsb3JlIHRoZSBwb3NzaWJsZSByZWxhdGlvbiBiZXR3ZWVuIHR1cm5vdXQgYW5kIHZvdGUgY291bnRzLgoKIyMjIyBCeSBDb3VudHkKCmBgYHtyIHByb2Nlc3NfcHJlc2lkZW50aWFsX2NvdW50eV90dXJub3V0LCByZXN1bHRzPSJoaWRlIn0KIyBHZXQgdm90aW5nIHJhdGUgZnJvbSB3aWRlIGRhdGEgdG8gbG9uZy4KcF9jb3VudHlfbCA8LSBwX2NvdW50eV9sW3BfY291bnR5LCBUdXJub3V0Oj1pLlR1cm5vdXQsIG9uPS4oQ291bnR5KV0KYGBgCgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXRfYmFyLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IGJ5IENvdW50eSJ9CnAgPC0gZ2dwbG90KHBfY291bnR5LCBhZXMoeD1yZW9yZGVyKENvdW50eSwgVHVybm91dCksIHk9VHVybm91dCkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPS44LCBmaWxsPSJ3aGl0ZSIsIGNvbG9yPSJibGFjayIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXBhc3RlKFR1cm5vdXQsICIlIikpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9Mi41KSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3mipXnpajnjofmjpLluo/vvIkiLCB5PSLmipXnpajnjociLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrmipXnpajnjociKSArCiAgY29vcmRfZmxpcCgpCgpnZ3Bsb3RseShwLCB3aWR0aD04MDAsIGhlaWdodD02MDAsIHRvb2x0aXA9TlVMTCkKYGBgCgpJdCBpcyB3aWRlbHkgc3VnZ2VzdGVkIHRoYXQgYW4gaW5jcmVhc2luZyB2b3RlciB0dXJub3V0IGR1ZSB0byB5b3VuZ2VyIGdlbmVyYXRpb24gdGhpcyB0aW1lIGNhbiBodWdlbHkgaW1wYWN0IHRoZSByZXN1bHRzLgpIZXJlIHdlIHBsb3QgdGhlIHR1cm5vdXQgYWdhaW5zdCBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzIGJ5IGNvdW50eToKCmBgYHtyIHByZXNpZGVudGlhbF9jb3VudHlfdHVybm91dF92c2QsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IGJ5IENvdW50eSJ9CmdncGxvdChwX2NvdW50eSwgYWVzKHg9VHVybm91dCwgeT1TaGFyZV9EaWZmLCBsYWJlbD1Db3VudHkpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cz1jKDM1LCA4MCkpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLCBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD0wKSwgZmlsbD0ibGlnaHRibHVlIiwgYWxwaGE9LjgpICsKICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0PTApLCBjb2xvcj0icmVkIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIpICsKICBnZW9tX3RleHQoY2hlY2tfb3ZlcmxhcD1UUlVFLCBjb2xvcj0iZ3JleTQwIikgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i57ag6JeN5b6X56Wo546H5beuIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546H77y46JeN57ag5b6X56Wo546H5beuIikKYGBgCgpXZSB6b29tLWluIGluIHRoZSBmb2xsb3dpbmcgcGxvdCBmb3IgdGhvc2Ugd2l0aCB0dXJub3V0ID4gNzAlOgoKYGBge3IgcHJlc2lkZW50aWFsX2NvdW50eV90dXJub3V0NzBfdnNkLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCAoPjcwJSkgYnkgQ291bnR5In0KZ2dwbG90KHBfY291bnR5W1R1cm5vdXQgPiA3MF0sIGFlcyh4PVR1cm5vdXQsIHk9U2hhcmVfRGlmZiwgbGFiZWw9Q291bnR5KSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHM9Yyg3MCwgODApKSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9jb3VudHlbVHVybm91dCA+IDcwXVsxXSwKICAgICAgICAgICAgYWVzKHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49MCwgeW1heD1JbmYpLCBmaWxsPSJsaWdodGdyZWVuIiwgYWxwaGE9LjgpICsKICBnZW9tX3JlY3QoZGF0YT1wX2NvdW50eVtUdXJub3V0ID4gNzBdWzFdLAogICAgICAgICAgICBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PTApLCBmaWxsPSJsaWdodGJsdWUiLCBhbHBoYT0uOCkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGNvbG9yPSJyZWQiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3RleHRfcmVwZWwoY29sb3I9ImdyZXk0MCIpICsKICBsYWJzKHg9IuaKleelqOeOh++8hSIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+e4vee1seWkp+mBuOWQhOe4o+W4gu+8muaKleelqOeOhyg+NzAlKe+8uOe2oOiXjeW+l+elqOeOh+W3riIpCmBgYAoKV2UgY2FuIGFsc28gdmlzdWFsaXplIHRoZSB0dXJub3V0IHJlbGF0aW9uIG9uIGVhY2ggcGFydHkgY2FuZGlkYXRlIGluc3RlYWQ6CgpgYGB7ciBwcmVzaWRlbnRpYWxfY291bnR5X3R1cm5vdXRfdnMsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zLCBmaWcuY2FwPSIyMDIwIFByZXNpZGVudGlhbCBFbGVjdGlvbiBWb3RlciBUdXJub3V0IHZzIENhbmRpZGF0ZSBWb3RlIFNoYXJlcyBieSBDb3VudHkifQpnZ3Bsb3QocF9jb3VudHlfbCwgYWVzKHg9VHVybm91dCwgeT1Wb3Rlc19TaGFyZSkpICsKICBnZW9tX3JlY3QoZGF0YT11bmlxdWUocF9jb3VudHlfbCwgYnk9IkNhbmRpZGF0ZSIpLCBhZXMoZmlsbD1DYW5kaWRhdGUpLAogICAgICAgICAgICB4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9SW5mLCBhbHBoYT0uNSkgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBjb2xvcj0iYmxhY2siKSArCiAgZmFjZXRfZ3JpZCh+IENhbmRpZGF0ZSkgKwogIGxhYnMoeD0i5oqV56Wo546H77yFIiwgeT0i5b6X56Wo546HIiwKICAgICAgIHRpdGxlPSIyMDIw5Y+w54Gj57i957Wx5aSn6YG45ZCE57ij5biC77ya5oqV56Wo546H77y45b6X56Wo546HIikKYGBgCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIyBCeSBDb3VudHkgU3ViLVJlZ2lvbgoKYGBge3IgcHJvY2Vzc19wcmVzaWRlbnRpYWxfcmVnaW9uX3R1cm5vdXR9CiMgQ29tcHV0ZSByZWdpb24tbGV2ZWwgdm90aW5nIHJhdGUgYW5kIHZvdGUgc2hhcmVzIGluIHRoZSBsb25nIGRhdGEuCnBfcmVnaW9uX2wgPC0gcF9yZWdpb25fbFtwX3JlZ2lvbiwgVHVybm91dDo9aS5UdXJub3V0LCBvbj0uKFJlZ2lvbildCnBfcmVnaW9uX2wgPC0gcF9yZWdpb25fbFssIFZvdGVzX1NoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oUmVnaW9uKV0KYGBgCgpGcm9tIHRoZSBwcmV2aW91cyBjb3VudHktbGV2ZWwgdmlzdWFsaXphdGlvbiB3ZSByZWFsaXplZCB0aGF0IHR1cm5vdXQgbWF5IGJlIHJlbGF0ZWQgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBERFAgYW5kIEtNVCBjYW5kaWRhdGVzLgpIZXJlIHdlIHVzZSBhIHNpbXBsZSBsaW5lYXIgbW9kZWwgdG8gdGVzdCB0aGUgY29ycmVsYXRpb24gYmFzZWQgb24gcmVnaW9uLWxldmVsIGRhdGE6CgpgYGB7ciBsbV90dXJub3V0X3ZzZH0KbG1fdHVybm91dCA8LSBsbShTaGFyZV9EaWZmIH4gVHVybm91dCwgZGF0YT1wX3JlZ2lvbl9sKQpjb2VmdGVzdChsbV90dXJub3V0LCB2Y292PXZjb3ZIQyhsbV90dXJub3V0LCB0eXBlPSJIQzAiKSkKYGBgCgpBcHBhcmVudGx5IHRoZSBjb3JyZWxhdGlvbiBpcyBzaWduaWZpY2FudC4KTGV0J3MgYWxzbyBnZW5lcmF0ZSB0aGUgcmVnaW9uLWxldmVsIHNjYXR0ZXJwbG90OgoKYGBge3IgcHJlc2lkZW50aWFsX3JlZ2lvbl90dXJub3V0X3ZzZCwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgYnkgUmVnaW9uIn0KZ2dwbG90KHBfcmVnaW9uLCBhZXMoeD1UdXJub3V0LCB5PVNoYXJlX0RpZmYpKSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9yZWdpb25bMV0sIGFlcyh4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPTAsIHltYXg9SW5mKSwKICAgICAgICAgICAgZmlsbD0ibGlnaHRncmVlbiIsIGFscGhhPS44KSArCiAgZ2VvbV9yZWN0KGRhdGE9cF9yZWdpb25bMV0sIGFlcyh4bWluPS1JbmYsIHhtYXg9SW5mLCB5bWluPS1JbmYsIHltYXg9MCksCiAgICAgICAgICAgIGZpbGw9ImxpZ2h0Ymx1ZSIsIGFscGhhPS44KSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD0wKSwgY29sb3I9InJlZCIpICsKICBnZW9tX3BvaW50KCkgKwogIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iKSArCiAgbGFicyh4PSLmipXnpajnjofvvIUiLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITphInpjq7luILljYDvvJrmipXnpajnjofvvLjntqDol43lvpfnpajnjoflt64iKQpgYGAKCkFnYWluIHdpdGggYWRkaXRpb25hbCB6b29tLWluOgoKYGBge3IgcHJlc2lkZW50aWFsX3JlZ2lvbl90dXJub3V0NzBfdnNkLCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBQcmVzaWRlbnRpYWwgRWxlY3Rpb24gVm90ZXIgVHVybm91dCAoPjcwJSkgYnkgUmVnaW9uIn0KZ2dwbG90KHBfcmVnaW9uW1R1cm5vdXQgPiA3MF0sIGFlcyh4PVR1cm5vdXQsIHk9U2hhcmVfRGlmZiwgbGFiZWw9UmVnaW9uKSkgKwogIGdlb21fcmVjdChkYXRhPXBfcmVnaW9uWzFdLCBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0wLCB5bWF4PUluZiksCiAgICAgICAgICAgIGZpbGw9ImxpZ2h0Z3JlZW4iLCBhbHBoYT0uOCkgKwogIGdlb21fcmVjdChkYXRhPXBfcmVnaW9uWzFdLCBhZXMoeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PTApLAogICAgICAgICAgICBmaWxsPSJsaWdodGJsdWUiLCBhbHBoYT0uOCkgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9MCksIGNvbG9yPSJyZWQiKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2Q9ImxtIiwgc2U9RkFMU0UpICsKICBnZW9tX3RleHQoY2hlY2tfb3ZlcmxhcD1UUlVFLCBudWRnZV95PS0uMDM1LCBjb2xvcj0iZGFya2dyZXkiKSArCiAgbGFicyh4PSLmipXnpajnjofvvIUiLCB5PSLntqDol43lvpfnpajnjoflt64iLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITphInpjq7luILljYDvvJrmipXnpajnjocoPjcwJSnvvLjntqDol43lvpfnpajnjoflt64iKQpgYGAKCldlIGNhbiBhbHNvIHRlc3QgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdHVybm91dCBhbmQgdm90ZSBzaGFyZSBvZiBlYWNoIHBhcnR5J3MgY2FuZGlkYXRlczoKCmBgYHtyIGxtX3ZyX3ZzfQpmb3IgKCBjYW5kaWRhdGUgaW4gdW5pcXVlKHBfcmVnaW9uX2wkQ2FuZGlkYXRlKSApIHsKICBsbV90dXJub3V0X2NhbmRpZGlhdGUgPC0gbG0oVm90ZXNfU2hhcmUgfiBUdXJub3V0LCBkYXRhPXBfcmVnaW9uX2xbQ2FuZGlkYXRlID09IGNhbmRpZGF0ZV0pCiAgbWVzc2FnZShyZXAoIi0iLCA4MCkpCiAgbWVzc2FnZSgiVGVzdCBjb3JyZWxhdGlvbiBiZXR3ZWVuIHZvdGUgc2hhcmVzIGFuZCB2b3RlciB0dXJub3V0LiIpCiAgbWVzc2FnZShzcHJpbnRmKCJGb3IgJXM6IiwgY2FuZGlkYXRlKSkKICBwcmludChjb2VmdGVzdChsbV90dXJub3V0X2NhbmRpZGlhdGUsIHZjb3Y9dmNvdkhDKGxtX3R1cm5vdXRfY2FuZGlkaWF0ZSwgdHlwZT0iSEMwIikpKQp9CmBgYAoKSW50ZXJlc3RpbmdseSwKc3VjaCBjb3JyZWxhdGlvbiBpcyBub3QgZm91bmQgZm9yIFBGUCBjYW5kaWRhdGVzLgoKYGBge3IgcHJlc2lkZW50aWFsX3JlZ2lvbl92cl92cywgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTMsIGZpZy5jYXA9IjIwMjAgUHJlc2lkZW50aWFsIEVsZWN0aW9uIFZvdGVyIFR1cm5vdXQgdnMgQ2FuZGlkYXRlIFZvdGUgU2hhcmVzIGJ5IFJlZ2lvbiJ9CmdncGxvdChwX3JlZ2lvbl9sLCBhZXMoeD1UdXJub3V0LCB5PVZvdGVzX1NoYXJlKSkgKwogIGdlb21fcmVjdChkYXRhPXVuaXF1ZShwX3JlZ2lvbl9sLCBieT0iQ2FuZGlkYXRlIiksIGFlcyhmaWxsPUNhbmRpZGF0ZSksCiAgICAgICAgICAgIHhtaW49LUluZiwgeG1heD1JbmYsIHltaW49LUluZiwgeW1heD1JbmYsIGFscGhhPS41KSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPW1haW5fcGFydHlfY29sb3JzKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdlb21fcG9pbnQoKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSJibGFjayIpICsKICBmYWNldF9ncmlkKH4gQ2FuZGlkYXRlKSArCiAgbGFicyh4PSLmipXnpajnjofvvIUiLCB5PSLlvpfnpajnjociLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPnuL3ntbHlpKfpgbjlkITnuKPluILvvJrmipXnpajnjocgWCDlvpfnpajnjociKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMjIEJ5IFBvbGxpbmcgUGxhY2UKClRCQy4KCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyDnrKzljYHlsYbnq4vms5Xlp5Tlk6HpgbjoiInntZDmnpwgVGhlIDEwdGggTGVnaXNsYXRpdmUgRWxlY3Rpb24gUmVzdWx0cyB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIyDkuI3liIbljYDnq4vlp5QgUGFydHkgTGlzdCB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCmBgYHtyIHByb2Nlc3NfcGFydHlfbGlzdF9yZXN1bHRzLCByZXN1bHRzPSJoaWRlIn0KcGFydHlsaXN0IDwtIGZyZWFkKCJkYXRhL3Byb2Nlc3NlZC9sZWdpc2xhdGl2ZS9sZWdpc2xhdGl2ZV/nrKwxMOWxhuWFqOWci+S4jeWIhuWNgOWPiuWDkeWxheWci+WkluWci+awkeeri+azleWnlOWToS5jc3YiLCBlbmNvZGluZz0iVVRGLTgiKQpwYXJ0eWxpc3QgPC0gcGFydHlsaXN0WywgUmVnaW9uOj10cmltd3MoUmVnaW9uLCB3aGl0ZXNwYWNlPSJbXFxoXFx2XSIpXSAgIyBUcmltIGZ1bGwtd2lkdGggd2hpdGUgc3BhY2UuCmNvbHNfYXJlYSA8LSBjKCJCeSIsICJSZWdpb24iLCAiVmlsbGFnZSIsICJQbGFjZSIpCmNvbHNfcGFydHkgPC0gbmFtZXMocGFydHlsaXN0KVs3OjI1XSAgIyBUaGVyZSBhcmUgMTkgcGFydGllcyBpbiB0b3RhbC4KcGFydHlsaXN0X2wgPC0gbWVsdChwYXJ0eWxpc3RbLCBjKGNvbHNfYXJlYSwgY29sc19wYXJ0eSksIHdpdGg9RkFMU0VdLAogICAgICAgICAgICAgICAgICAgaWQudmFycz1jb2xzX2FyZWEsIHZhcmlhYmxlLm5hbWU9IlBhcnR5IiwgdmFsdWUubmFtZT0iVm90ZXMiKQpwYXJ0eWxpc3RfbCA8LSBwYXJ0eWxpc3RfbFssIFBhcnR5Oj1mYWN0b3IoUGFydHkpXQpwYXJ0eWxpc3RfZmluYWwgPC0gcGFydHlsaXN0X2xbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKFBhcnR5KV0KcGFydHlsaXN0X2ZpbmFsIDwtIHBhcnR5bGlzdF9maW5hbFssIFNoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyldCmBgYAoKRm9yIHBhcnR5IGxpc3QgdG8gc2VjdXJlIGF0IGxlYXN0IG9uZSBzZWF0IGluIFtMZWdpc2xhdGl2ZSBZdWFuXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZWdpc2xhdGl2ZV9ZdWFuKSwKaXQgbXVzdCBvYnRhaW4gbWluaW1hbGx5IDUlIG9mIHBhcnR5LWxpc3Qgdm90ZXMuCklmIGEgcGFydHkgY2Fubm90IHBhc3MgdGhlIDUlIHRocmVzaG9sZCBidXQgcGFzcyB0aGUgMyUgdGhyZXNob2xkLAppdCB3aWxsIGJlIHNwb25zb3JlZCBieSB0aGUgZ292ZXJubWVudCBpbiB0aGUgZm9sbG93aW5nIDQgeWVhcnMgKGJhc2VkIG9uIG51bWJlciBvZiB2b3RlcyBvYnRhaW5lZCkuClRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3Igc21hbGwgcGFydGllcyB0byBjb3ZlciB0aGVpciBvcGVyYXRpbmcgY29zdHMuCgpgYGB7ciBwYXJ0eWxpc3RfZmluYWxfcmVzdWx0LCBmaWcuc2hvd3RleHQ9VFJVRSwgZmlnLmNhcD0iMjAyMCBMZWdpc2xhdGl2ZSBFbGVjdGlvbiBQYXJ0eSBMaXN0IEZpbmFsIE91dGNvbWUifQp0aHJlc18wMDMgPC0gc3VtKHBhcnR5bGlzdF9maW5hbCRWb3RlcykgKiAuMDMKdGhyZXNfMDA1IDwtIHN1bShwYXJ0eWxpc3RfZmluYWwkVm90ZXMpICogLjA1CgpnZ3Bsb3QocGFydHlsaXN0X2ZpbmFsLCBhZXMoeD1yZW9yZGVyKFBhcnR5LCBWb3RlcyksIHk9Vm90ZXMpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArCiAgbGFicyh4PSLmlL/pu6giLCB5PSLlvpfnpajmlbgiLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPkuI3liIbljYDnq4vlp5TpgbjoiInntZDmnpwiKSArCiAgZ2VvbV90ZXh0KGFlcyh4PVBhcnR5LCB5PVZvdGVzLAogICAgICAgICAgICAgICAgbGFiZWw9c3ByaW50ZigiJXMgKCVzKSIsIHNjYWxlczo6Y29tbWEoVm90ZXMpLCBzY2FsZXM6OnBlcmNlbnQoU2hhcmUsIC4wMSkpKSwKICAgICAgICAgICAgc2l6ZT0zLCBoanVzdD0tLjA1KSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hLCBsaW1pdHM9YygwLCBtYXgocGFydHlsaXN0X2ZpbmFsJFZvdGVzKSAqIDEuMjUpKSArCiAgZ2VvbV9obGluZShhZXMoeWludGVyY2VwdD10aHJlc18wMDMsIGNvbG9yPSLoo5zliqkgU3BvbnNvcnNoaXAiKSwgbGluZXR5cGU9MykgKwogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQ9dGhyZXNfMDA1LCBjb2xvcj0i5bit5qyhIFNlYXRzIiksIGxpbmV0eXBlPTMpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKG5hbWU9IumWgOaquyBUaHJlc2hvbGQiLCB2YWx1ZXM9YygicmVkIiwgImdyZWVuIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIyMjIEJ5IENvdW50eQoKV2UgZ3JvdXAgcGFydGllcyB3aXRoIGxlc3MgdGhhbiAyJSB2b3RlcyBpbnRvICJvdGhlcnMiIHRvIG1ha2UgdGhlIHJlc3Qgb2YgdGhlIHBsb3RzIGVhc2llciB0byByZWFkLgoKYGBge3IgcHJvY2Vzc19wYXJ0eV9saXN0X2NvdW50eSwgcmVzdWx0cz0iaGlkZSJ9CnBhcnR5bGlzdF9jb3VudHkgPC0gcGFydHlsaXN0X2xbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKEJ5LCBQYXJ0eSldCnNtYWxsX3BhcnRpZXMgPC0gcGFydHlsaXN0X2ZpbmFsW1NoYXJlIDwgLjAyLCBQYXJ0eV0KCnBhcnR5bGlzdF9jb3VudHkgPC0gcGFydHlsaXN0X2NvdW50eVtQYXJ0eSAlaW4lIHNtYWxsX3BhcnRpZXMsIFBhcnR5Oj0i5YW25LuWIl0KcGFydHlsaXN0X2NvdW50eSA8LSBwYXJ0eWxpc3RfY291bnR5WywgUGFydHk6PWZhY3RvcihQYXJ0eSldICAjIFJlbmV3IGxldmVsLgpwYXJ0eWxpc3RfY291bnR5IDwtIHBhcnR5bGlzdF9jb3VudHlbLCAuKFZvdGVzPXN1bShWb3RlcykpLCBieT0uKEJ5LCBQYXJ0eSldICAjIFJlLWdyb3VwLgpwYXJ0eWxpc3RfY291bnR5IDwtIHBhcnR5bGlzdF9jb3VudHlbLCBTaGFyZTo9Vm90ZXMgLyBzdW0oVm90ZXMpLCBieT0uKEJ5KV0KCiMgQ29tcHV0ZSBEUFAtS01UIHNoYXJlIGRpZmZlcmVuY2VzLgpwYXJ0eWxpc3RfY291bnR5X2diIDwtIHBhcnR5bGlzdF9jb3VudHlbUGFydHkgJWluJSBjKCIoMTQpICDmsJHkuLvpgLLmraXpu6giLCAiKDkpICDkuK3lnIvlnIvmsJHpu6giKV0Kc2V0b3JkZXIocGFydHlsaXN0X2NvdW50eV9nYiwgQnksIFBhcnR5KQpwYXJ0eWxpc3RfY291bnR5X2diX2RpZmYgPC0gcGFydHlsaXN0X2NvdW50eV9nYlssIC4oU2hhcmVfRGlmZj1TaGFyZVsyXSAtIFNoYXJlWzFdKSwgYnk9LihCeSldCnBhcnR5bGlzdF9jb3VudHlfZ2JfZGlmZiA8LSBwYXJ0eWxpc3RfY291bnR5X2diX2RpZmZbLCBkcHBfd2luOj1TaGFyZV9EaWZmID4gMF0KYGBgCgpgYGB7ciBwYXJ0eV9saXN0X2NvdW50eSwgZmlnLnNob3d0ZXh0PVRSVUUsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gUGFydHkgTGlzdCBWb3RlIFNoYXJlcyBieSBDb3VudHkifQpwYXJ0eV9jb2xvcnMgPC0gYygiZGFya29yYW5nZSIsICJkYXJrZ3JlZW4iLCAieWVsbG93IiwgImRvZGdlcmJsdWUiLCAiZ3JlZW4iLCAiZ3JlZW4zIiwgImxpZ2h0Ymx1ZSIsICJncmV5IikKZ2dwbG90KHBhcnR5bGlzdF9jb3VudHksIGFlcyh4PXJlb3JkZXIoQnksIFZvdGVzKSwgeT1TaGFyZSwgZmlsbD1QYXJ0eSkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPSJzdGFjayIsIHdpZHRoPS44KSArCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoU2hhcmUsIC4wMSkpLCBwb3NpdGlvbj1wb3NpdGlvbl9zdGFjayh2anVzdD0uNSksIHNpemU9MiwgYW5nbGU9MjApICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lPSLmlL/pu6giLCB2YWx1ZXM9cGFydHlfY29sb3JzKSArCiAgbGFicyh4PSLnuKPluILvvIjkvp3nuL3npajmlbjmjpLluo/vvIkiLCB5PSLlvpfnpajnjociLAogICAgICAgdGl0bGU9IjIwMjDlj7DngaPkuI3liIbljYDnq4vlp5TlkITnuKPluILmlL/pu6jlvpfnpajnjociKSArCiAgY29vcmRfZmxpcCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb249ImJvdHRvbSIpCmBgYAoKYGBge3IgcGFydHlfbGlzdF9kcHBfa210X2RpZmYsIGZpZy5jYXA9IjIwMjAgTGVnaXNsYXRpdmUgRWxlY3Rpb24gUGFydHkgTGlzdCBEUFAtS01UIFNoYXJlIERpZmZlcmVuY2UgYnkgQ291bnR5In0KcCA8LSBnZ3Bsb3QocGFydHlsaXN0X2NvdW50eV9nYl9kaWZmLCBhZXMoeD1yZW9yZGVyKEJ5LCBTaGFyZV9EaWZmKSwgZmlsbD1kcHBfd2luLCB5PVNoYXJlX0RpZmYpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCB3aWR0aD0uOCwgY29sb3I9ImJsYWNrIiwgYWxwaGE9LjUpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiZG9kZ2VyYmx1ZSIsICJncmVlbjMiKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChTaGFyZV9EaWZmKSksIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PS41KSwgc2l6ZT0yLjUpICsKICBsYWJzKHg9Iue4o+W4gu+8iOS+neW+l+elqOeOh+W3ruaOkuW6j++8iSIsIHk9Iue2oOiXjeW+l+elqOeOh+W3riIsCiAgICAgICB0aXRsZT0iMjAyMOWPsOeBo+S4jeWIhuWNgOeri+WnlOWQhOe4o+W4gu+8mue2oOiXjeW+l+elqOeOh+W3riIpICsKICBjb29yZF9mbGlwKCkKCmdncGxvdGx5KHAsIHdpZHRoPTgwMCwgaGVpZ2h0PTYwMCkKYGBgCgpbR28gQmFjayB0byBUb3BdKCNoZWFkKQoKIyMjIyBCeSBDb3VudHkgU3ViLVJlZ2lvbgoKYGBge3IgcHJvY2Vzc19wYXJ0eV9saXN0X3JlZ2lvbiwgcmVzdWx0cz0iaGlkZSJ9CiMgUHJvY2VzcyByZWdpb24tbGV2ZWwgcGFydHkgbGlzdCByZXN1bHRzLgpwYXJ0eWxpc3RfcmVnaW9uIDwtIHBhcnR5bGlzdF9sWywgLihWb3Rlcz1zdW0oVm90ZXMpKSwgYnk9LihCeSwgUmVnaW9uLCBQYXJ0eSldCnBhcnR5bGlzdF9yZWdpb24gPC0gcGFydHlsaXN0X3JlZ2lvblssIFBhcnR5Oj1mYWN0b3IoUGFydHkpXSAgIyBSZW5ldyBsZXZlbC4KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uWywgU2hhcmU6PVZvdGVzIC8gc3VtKFZvdGVzKSwgYnk9LihCeSwgUmVnaW9uKV0KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uWyFQYXJ0eSAlaW4lIHNtYWxsX3BhcnRpZXNdICAjIElnbm9yZSBzbWFsbCBwYXJ0aWVzLgoKIyBHZXQgcHJlc2lkZW50aWFsIGludmFsaWQgdm90ZSBzaGFyZSBhbmQgdHVybm91dC4KcGFydHlsaXN0X3JlZ2lvbiA8LSBwYXJ0eWxpc3RfcmVnaW9uW3BfcmVnaW9uLCBgOj1gKAogIFBfSW52YWxpZF9Wb3Rlc19TaGFyZT1pLkludmFsaWRfVm90ZXNfU2hhcmUsCiAgUF9UdXJub3V0PWkuVHVybm91dAogICksIG9uPS4oQnksIFJlZ2lvbildCgojIEdldCBwcmVzaWRlbnRpYWwgdm90ZSByZXN1bHRzLgpwX3JlZ2lvbl9sIDwtIHBfcmVnaW9uX2xbLCBQX1NoYXJlOj1Wb3RlcyAvIHN1bShWb3RlcyksIGJ5PS4oQnksIFJlZ2lvbildCnBhcnR5bGlzdF9yZWdpb24gPC0gbWVyZ2UocGFydHlsaXN0X3JlZ2lvbiwgcF9yZWdpb25fbFssIC4oQnksIFJlZ2lvbiwgQ2FuZGlkYXRlLCBQX1NoYXJlLCBTaGFyZV9EaWZmKV0sIGJ5PWMoIkJ5IiwgIlJlZ2lvbiIpLCBhbGxvdy5jYXJ0ZXNpYW49VFJVRSkKCiMgSGVscGVyIGZ1bmN0aW9uIGZvciBzY2F0dGVyIHBsb3QuCnNjYXR0ZXJwbG90IDwtIGZ1bmN0aW9uKCkgewogIGdncGxvdChwYXJ0eWxpc3RfcmVnaW9uLCBhZXMoeD1TaGFyZSwgeT1QX1NoYXJlLCBjb2xvcj1DYW5kaWRhdGUpKSArCiAgICBnZW9tX3JlY3QoZGF0YT11bmlxdWUocGFydHlsaXN0X3JlZ2lvbiwgYnk9YygiUGFydHkiLCAiQ2FuZGlkYXRlIikpLCBhZXMoZmlsbD1QYXJ0eSksCiAgICAgICAgICAgICAgeG1pbj0tSW5mLCB4bWF4PUluZiwgeW1pbj0tSW5mLCB5bWF4PUluZiwgYWxwaGE9LjI1KSArCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9cGFydHlfY29sb3JzKSArCiAgICBnZW9tX3BvaW50KHNpemU9LjUpICsKICAgIGdlb21fc21vb3RoKG1ldGhvZD0ibG0iLCBhZXMoY29sb3I9Q2FuZGlkYXRlKSkgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1tYWluX3BhcnR5X2NvbG9ycykgKwogICAgbGFicyh4PSLnuL3ntbHlgJnpgbjkurrlvpfnpajnjociLCB5PSLkuI3liIbljYDmlL/pu6jlvpfnpajnjociLAogICAgICAgICB0aXRsZT0iMjAyMOe4vee1seWAmemBuOS6uuW+l+elqOeOh++8uOS4jeWIhuWNgOaUv+m7qOW+l+elqOeOhyIpICsKICAgIGZhY2V0X3dyYXAoUGFydHkgfiBDYW5kaWRhdGUsIG5jb2w9Mywgc2NhbGVzPSJmcmVlIikKfQpgYGAKCldlIGNhbiBwbG90IHRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIHByZXNpZGVudGlhbCBjYW5kaWRhdGUgdm90ZSBzaGFyZXMgYW5kIHBhcnR5IHZvdGUgc2hhcmVzIGF0IHJlZ2lvbiBsZXZlbC4KQnV0IHdlIG11c3QgYmUgdmVyeSBjYXJlZnVsIGluIGludGVycHJldGluZyB0aGUgcmVsYXRpb24gc2luY2Ugd2UgZG9uJ3Qga25vdyB0aGUgZGlyZWN0aW9uIG9mIHN1Y2ggcmVsYXRpb24sIGlmIGFueS4KU3RyaWN0bHkgc3BlYWtpbmcsCndlIGRvbid0IGV2ZW4ga25vdyB3aGV0aGVyIHRoZXkgYXJlIGNhdXNhbGx5IHJlbGF0ZWQgYXQgYWxsLgoKYGBge3IsIGZpZy5oZWlnaHQ9MTUsIGZpZy5zaG93dGV4dD1UUlVFLCBmaWcuY2FwPSIyMDIwIExlZ2lzbGF0aXZlIEVsZWN0aW9uIFBhcnR5IExpc3QgU2hhcmVzIHYucy4gUHJlc2lkZW50aWFsIFZvdGVzIn0Kc2NhdHRlcnBsb3QoKQpgYGAKCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIyMg5YiG5Y2A56uL5aeUIENvbnN0aXR1ZW5jeSB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KClRCQy4KCltHbyBCYWNrIHRvIFRvcF0oI2hlYWQpCgojIFJlZmVyZW5jZXMgb24gUiBQYWNrYWdlcwo=